/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.general.bc;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.Rubro;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.DatosController;
import org.cip.esymons.general.util.InterceptorAuditor;

/**
 *
 * @author OscarA
 */
@Stateless
@DatosController(nombresFacesConfig = "personaJuridicaController")
@Interceptors({InterceptorAuditor.class})
public class SolicitanteFacade implements SolicitanteFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(Solicitante solicitante) {
        em.persist(solicitante);
    }

    public void edit(Solicitante solicitante) {
        em.merge(solicitante);
    }

    public void remove(Solicitante solicitante) {
        em.remove(em.merge(solicitante));
    }

    public Solicitante find(Object id) {
        return em.find(Solicitante.class, id);
    }

    public List<Solicitante> findAll() {
        return em.createQuery("select object(o) from Solicitante as o").getResultList();
    }

    public Long buscarxRuc(String ruc) {
        Vector vect = (Vector) em.createNativeQuery("select sol_codigo from gen_Solicitante where sol_ruc='" + ruc + "'").getSingleResult();
        return Long.valueOf(vect.firstElement().toString());

    }

    //gilmar
    public Solicitante buscarPorRuc(String ruc) {
        try {
            return (Solicitante) em.createQuery("select o from Solicitante o where o.solRUC=?1").setParameter(1, ruc).getSingleResult();
        } catch (Exception e) {
            return null;
        }


    }

    public List<PersonaNatural> buscarPerNatural(String dni, String apePat, String apeMat, String nombres, String ruc, boolean buscarSoloColegiados) {
        try {
            if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) ||
                    (nombres != null && !nombres.isEmpty()) || (dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                Query q = null;
                StringBuilder sb = new StringBuilder();
                sb.append(" SELECT ");
                sb.append(" gen_persona_natural.per_codigo,");
                sb.append(" gen_persona_natural.per_apellidoPaterno,");
                sb.append(" gen_persona_natural.per_apellidoMaterno,");
                sb.append(" gen_persona_natural.per_nombres,");
                sb.append(" gen_persona_natural.per_sexo,");
                sb.append(" gen_persona_natural.per_fechaNacimiento,");
                sb.append(" gen_persona_natural.per_activo,");
                sb.append(" gen_persona_natural.per_fechaRegistro,");
                sb.append(" gen_persona_natural.per_tieneImagen,");
                sb.append(" gen_persona_natural.per_tipo,");
                sb.append(" gen_persona_natural.per_especTemp,");
                sb.append(" gen_persona_natural.per_nroDni,");
                sb.append(" gen_persona_natural.per_nroPasaporte,");
                sb.append("gen_solicitante.sol_codigo,");
                sb.append("gen_solicitante.sol_tipo,");
                sb.append("gen_solicitante.sol_pagweb,");
                sb.append("gen_solicitante.sol_ruc");
                sb.append(" FROM");
                sb.append(" gen_persona_natural ");
                sb.append(" INNER JOIN  gen_solicitante ON (gen_solicitante.sol_codigo = gen_persona_natural.per_codigo)");
                if (buscarSoloColegiados) {
                    sb.append(" INNER JOIN  col_colegiado ON (gen_solicitante.sol_codigo = col_colegiado.col_codigo)");
                }
                Integer cont = 0;
                if ((dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                    sb.append(" WHERE");
                    if (dni != null && !dni.isEmpty()) {
                        sb.append(" gen_persona_natural.per_nroDni like ?").append((++cont).toString());
                    }

                    if (ruc != null && !ruc.isEmpty()) {
                        if (cont > 0) {
                            sb.append(" and ");
                        }
                        sb.append(" gen_solicitante.sol_ruc like ?").append((++cont).toString());
                    }

                } else {
                    if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) || (nombres != null && !nombres.isEmpty())) {
                        sb.append(" WHERE");
                        if (apePat != null && !apePat.isEmpty()) {
                            sb.append(" gen_persona_natural.per_apellidoPaterno like ?").append((++cont).toString());
                        }
                        if (apeMat != null && !apeMat.isEmpty()) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_natural.per_apellidoMaterno like ?").append((++cont).toString());
                        }
                        if (nombres != null && !nombres.isEmpty()) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_natural.per_nombres like ?").append((++cont).toString());
                        }
                    }
                }

                q = em.createNativeQuery(sb.toString(), PersonaNatural.class);
                cont = 0;
                if ((dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                    if (dni != null && !dni.isEmpty()) {
                        q.setParameter(++cont, dni + "%");
                    }
                    if (ruc != null && !ruc.isEmpty()) {
                        q.setParameter(++cont, ruc + "%");
                    }
                } else {
                    if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) || (nombres != null && !nombres.isEmpty())) {

                        if (apePat != null && !apePat.isEmpty()) {
                            q.setParameter(++cont, apePat + "%");
                        }
                        if (apeMat != null && !apeMat.isEmpty()) {
                            q.setParameter(++cont, apeMat + "%");
                        }
                        if (nombres != null && !nombres.isEmpty()) {
                            q.setParameter(++cont, nombres + "%");
                        }
                    }
                }
                return q.getResultList();
            } else {
                return new ArrayList();
            }

        } catch (Exception ex) {

            return new ArrayList();
        }

    }

    public List<PersonaJuridica> buscarPerJuridica(String ruc, String razSoc, Rubro rubro) {
        try {

            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" SELECT ");
            sb.append(" gen_solicitante.sol_codigo,");
            sb.append(" gen_solicitante.sol_tipo,");
            sb.append(" gen_solicitante.sol_pagweb,");
            sb.append(" gen_solicitante.sol_ruc,");
            sb.append(" gen_persona_juridica.emp_codigo,");
            sb.append(" gen_persona_juridica.rub_codigo,");
            sb.append(" gen_persona_juridica.emp_razonSocial,");
            sb.append(" gen_persona_juridica.emp_representante");
            sb.append(" FROM");
            sb.append(" gen_solicitante");
            sb.append(" INNER JOIN gen_persona_juridica ON (gen_solicitante.sol_codigo = gen_persona_juridica.emp_codigo)");

            if ((ruc != null && !ruc.isEmpty()) || (razSoc != null && !razSoc.isEmpty()) ||
                    (rubro != null)) {
                if (rubro != null) {
                    if (rubro.getRubDescripcion().equals("Todos")) {
                        sb.append(" order by gen_persona_juridica.emp_razonSocial asc");
                        q = em.createNativeQuery(sb.toString(), PersonaJuridica.class);
                        return q.getResultList();
                    }
                }
                Integer cont = 0;
                if (ruc != null && !ruc.isEmpty()) {
                    sb.append(" WHERE gen_solicitante.sol_ruc like ?").append((++cont).toString());
                } else {
                    if ((razSoc != null && !razSoc.isEmpty()) || rubro != null) {
                        sb.append(" WHERE ");
                        if (razSoc != null && !razSoc.isEmpty()) {
                            sb.append(" gen_persona_juridica.emp_razonSocial LIKE ?").append((++cont).toString());
                        }
                        if (rubro != null) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_juridica.rub_codigo = ?").append((++cont).toString());
                        }
                    }
                }
                sb.append(" order by gen_persona_juridica.emp_razonSocial asc");
                q = em.createNativeQuery(sb.toString(), PersonaJuridica.class);
                cont = 0;
                if (ruc != null && !ruc.isEmpty()) {
                    q.setParameter(++cont, ruc + "%");
                } else {
                    if ((razSoc != null && !razSoc.isEmpty()) || rubro != null) {
                        if (razSoc != null && !razSoc.isEmpty()) {
                            q.setParameter(++cont, razSoc + "%");
                        }
                        if (rubro != null) {
                            q.setParameter(++cont, rubro.getRubCodigo());
                        }
                    }
                }
                return q.getResultList();
            } else {
                return new ArrayList();
            }
        } catch (Exception ex) {
            System.out.println("error:" + ex.getMessage());
            return new ArrayList();
        }
    }

    public List<PersonaNatural> buscarPreInscrito(String dni, String apePat, String apeMat, String nombres, String ruc, boolean buscarSoloColegiados) {
        try {
            if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) ||
                    (nombres != null && !nombres.isEmpty()) || (dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                Query q = null;
                StringBuilder sb = new StringBuilder();
                sb.append(" SELECT ");
                sb.append(" gen_persona_natural.per_codigo,");
                sb.append(" gen_persona_natural.per_apellidoPaterno,");
                sb.append(" gen_persona_natural.per_apellidoMaterno,");
                sb.append(" gen_persona_natural.per_nombres,");
                sb.append(" gen_persona_natural.per_sexo,");
                sb.append(" gen_persona_natural.per_fechaNacimiento,");
                sb.append(" gen_persona_natural.per_activo,");
                sb.append(" gen_persona_natural.per_fechaRegistro,");
                sb.append(" gen_persona_natural.per_tieneImagen,");
                sb.append(" gen_persona_natural.per_tipo,");
                sb.append(" gen_persona_natural.per_especTemp,");
                sb.append(" gen_persona_natural.per_nroDni,");
                sb.append(" gen_persona_natural.per_nroPasaporte,");
                sb.append(" gen_solicitante.sol_codigo,");
                sb.append(" gen_solicitante.sol_tipo,");
                sb.append(" gen_solicitante.sol_pagweb,");
                sb.append(" gen_solicitante.sol_ruc");
                sb.append(" FROM");
                sb.append(" gen_persona_natural ");
                sb.append(" INNER JOIN  gen_solicitante ON (gen_solicitante.sol_codigo = gen_persona_natural.per_codigo)");
                if (buscarSoloColegiados) {
                    sb.append(" INNER JOIN  col_colegiado ON (gen_solicitante.sol_codigo = col_colegiado.col_codigo)");
                }
                Integer cont = 0;
                if ((dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                    sb.append(" WHERE ");
                    if (dni != null && !dni.isEmpty()) {
                        sb.append(" gen_persona_natural.per_nroDni like ? ").append((++cont).toString());
                    }

                    if (ruc != null && !ruc.isEmpty()) {
                        if (cont > 0) {
                            sb.append(" and ");
                        }
                        sb.append(" gen_solicitante.sol_ruc like ? ").append((++cont).toString());
                    }

                } else {
                    if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) || (nombres != null && !nombres.isEmpty())) {
                        sb.append(" WHERE gen_persona_natural.per_tipo = 2 and ");
                        if (apePat != null && !apePat.isEmpty()) {
                            sb.append(" gen_persona_natural.per_apellidoPaterno like ? ").append((++cont).toString());
                        }
                        if (apeMat != null && !apeMat.isEmpty()) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_natural.per_apellidoMaterno like ?").append((++cont).toString());
                        }
                        if (nombres != null && !nombres.isEmpty()) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_natural.per_nombres like ? ").append((++cont).toString());
                        }
                    }
                }

                q = em.createNativeQuery(sb.toString(), PersonaNatural.class);
                cont = 0;
                if ((dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                    if (dni != null && !dni.isEmpty()) {
                        q.setParameter(++cont, dni + "%");
                    }
                    if (ruc != null && !ruc.isEmpty()) {
                        q.setParameter(++cont, ruc + "%");
                    }
                } else {
                    if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) || (nombres != null && !nombres.isEmpty())) {

                        if (apePat != null && !apePat.isEmpty()) {
                            q.setParameter(++cont, apePat + "%");
                        }
                        if (apeMat != null && !apeMat.isEmpty()) {
                            q.setParameter(++cont, apeMat + "%");
                        }
                        if (nombres != null && !nombres.isEmpty()) {
                            q.setParameter(++cont, nombres + "%");
                        }
                    }
                }
                return q.getResultList();
            } else {
                return new ArrayList();
            }

        } catch (Exception ex) {

            return new ArrayList();
        }

    }

    public List<PersonaNatural> buscarPersona(String dni, String apePat, String apeMat, String nombres, String ruc, boolean buscarSoloColegiados) {
        try {
            if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) ||
                    (nombres != null && !nombres.isEmpty()) || (dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                Query q = null;
                StringBuilder sb = new StringBuilder();
                sb.append(" SELECT ");
                sb.append(" gen_persona_natural.per_codigo,");
                sb.append(" gen_persona_natural.per_apellidoPaterno,");
                sb.append(" gen_persona_natural.per_apellidoMaterno,");
                sb.append(" gen_persona_natural.per_nombres,");
                sb.append(" gen_persona_natural.per_sexo,");
                sb.append(" gen_persona_natural.per_fechaNacimiento,");
                sb.append(" gen_persona_natural.per_activo,");
                sb.append(" gen_persona_natural.per_fechaRegistro,");
                sb.append(" gen_persona_natural.per_tieneImagen,");
                sb.append(" gen_persona_natural.per_tipo,");
                sb.append(" gen_persona_natural.per_especTemp,");
                sb.append(" gen_persona_natural.per_nroDni,");
                sb.append(" gen_persona_natural.per_nroPasaporte,");
                sb.append("gen_solicitante.sol_codigo,");
                sb.append("gen_solicitante.sol_tipo,");
                sb.append("gen_solicitante.sol_pagweb,");
                sb.append("gen_solicitante.sol_ruc");
                sb.append(" FROM");
                sb.append(" gen_persona_natural ");
                sb.append(" INNER JOIN  gen_solicitante ON (gen_solicitante.sol_codigo = gen_persona_natural.per_codigo)");
                if (buscarSoloColegiados) {
                    sb.append(" INNER JOIN  col_colegiado ON (gen_solicitante.sol_codigo = col_colegiado.col_codigo)");
                }
                Integer cont = 0;
                if ((dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                    sb.append(" WHERE gen_persona_natural.per_tipo = 0  and");
                    if (dni != null && !dni.isEmpty()) {
                        sb.append(" gen_persona_natural.per_nroDni like ? ").append((++cont).toString());
                    }

                    if (ruc != null && !ruc.isEmpty()) {
                        if (cont > 0) {
                            sb.append(" and ");
                        }
                        sb.append(" gen_solicitante.sol_ruc like ? ").append((++cont).toString());
                    }

                } else {
                    if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) || (nombres != null && !nombres.isEmpty())) {
                        sb.append(" WHERE gen_persona_natural.per_tipo = 0  and ");
                        if (apePat != null && !apePat.isEmpty()) {
                            sb.append(" gen_persona_natural.per_apellidoPaterno like ?").append((++cont).toString());
                        }
                        if (apeMat != null && !apeMat.isEmpty()) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_natural.per_apellidoMaterno like ?").append((++cont).toString());
                        }
                        if (nombres != null && !nombres.isEmpty()) {
                            if (cont > 0) {
                                sb.append(" and ");
                            }
                            sb.append(" gen_persona_natural.per_nombres like ? ").append((++cont).toString());
                        }
                    }
                }

                q = em.createNativeQuery(sb.toString(), PersonaNatural.class);
                cont = 0;
                if ((dni != null && !dni.isEmpty()) || (ruc != null && !ruc.isEmpty())) {
                    if (dni != null && !dni.isEmpty()) {
                        q.setParameter(++cont, dni + "%");
                    }
                    if (ruc != null && !ruc.isEmpty()) {
                        q.setParameter(++cont, ruc + "%");
                    }
                } else {
                    if ((apePat != null && !apePat.isEmpty()) || (apeMat != null && !apeMat.isEmpty()) || (nombres != null && !nombres.isEmpty())) {

                        if (apePat != null && !apePat.isEmpty()) {
                            q.setParameter(++cont, apePat + "%");
                        }
                        if (apeMat != null && !apeMat.isEmpty()) {
                            q.setParameter(++cont, apeMat + "%");
                        }
                        if (nombres != null && !nombres.isEmpty()) {
                            q.setParameter(++cont, nombres + "%");
                        }
                    }
                }
                return q.getResultList();
            } else {
                return new ArrayList();
            }

        } catch (Exception ex) {

            return new ArrayList();
        }

    }
}
